/*
 * 问题：高精度整数乘法
 * 描述：计算两个最大长度为100位的非负整数的乘积
 * 难点：普通整数类型（int、long long等）无法存储100位整数，需用字符串模拟计算
 * 思路：模拟手工乘法过程，分四步：逆序存储→逐位相乘→处理进位→逆序输出
 */

#include <stdio.h>
#include <string.h>

// 宏定义：两个100位整数相乘，结果最大为200位（100+100），，+1防止数组越界
#define MAX_LEN 201

int main() {
    // 存储输入的两个高精度数（字符串形式，最多100位）
    char str1[101], str2[101];
    scanf("%s %s", str1, str2);  // 读取输入，如"123456789"和"987654321"
    
    // 获取两个数的长度（位数）
    int len1 = strlen(str1);
    int len2 = strlen(str2);

    // 数组用于存储逆序后的数字（方便从低位到高位计算）
    // 例如："123"逆序后存储为[3,2,1]（索引0对应个位，1对应十位，以此类推）
    int num1[MAX_LEN] = {0}, num2[MAX_LEN] = {0};
    
    // 逆序存储第一个数：将字符串转为整数并颠倒顺序
    for (int i = 0; i < len1; i++) {
        // str1[len1-1-i]：取原字符串的倒数第i+1个字符（从个位开始）
        // -'0'：将字符数字转为整数（如'9'→9）
        num1[i] = str1[len1 - 1 - i] - '0';
    }
    
    // 逆序存储第二个数（同上）
    for (int i = 0; i < len2; i++) {
        num2[i] = str2[len2 - 1 - i] - '0';
    }

    // 结果数组：存储乘积的每一位（初始全为0）
    int result[MAX_LEN] = {0};
    
    // 核心：模拟手工乘法，逐位相乘并累加
    // i：遍历第一个数的每一位（对应num1的第i位，即原数的10^i位）
    for (int i = 0; i < len1; i++) {
        // j：遍历第二个数的每一位（对应num2的第j位，即原数的10^j位）
        for (int j = 0; j < len2; j++) {
            // 两个位相乘的结果累加到result[i+j]位置
            // 原理：10^i × 10^j = 10^(i+j)，对应结果的第i+j位
            result[i + j] += num1[i] * num2[j];
            
            // 处理进位：当前位的值除以10得到进位，加到下一位
            result[i + j + 1] += result[i + j] / 10;
            // 当前位只保留除以10的余数（0-9）
            result[i + j] %= 10;
        }
    }

    // 确定结果的有效长度（去除前导零）
    // 初始猜测最大长度为两数长度之和（len1+len2）
    int result_len = len1 + len2;
    // 从最高位往前找，直到找到第一个非零数字（保留至少1位，避免全零情况）
    while (result_len > 1 && result[result_len - 1] == 0) {
        result_len--;
    }

    // 逆序输出结果：数组中存储的是逆序的数字，需从后往前打印
    for (int i = result_len - 1; i >= 0; i--) {
        printf("%d", result[i]);
    }
    printf("\n");  // 换行结束

    return 0;
}
    